问题: 正则表达式中[]的作用是什么,举例说明?

👇 点击展开/折叠 面试背诵模板(建议先背这个) `[]` 在正则中称为字符类(或字符集),用于匹配方括号内定义的任意一个字符。其核心作用是将多个字符或字符范围组合为一个匹配单元,匹配时仅需满足其中之一即可。支持范围表示(如 `[a-z]` 匹配任意小写字母)、预定义字符类的组合(如 `[a-zA-Z0-9]` 匹配字母数字)以及取反(`[^]` 匹配除指定字符外的任意字符)。字符类内部大部分元字符失去特殊含义,仅 `^`(开头取反)、`-`(范围)和 `]`(结尾)需特殊处理。
---

基础用法示例

1
2
3
4
5
6
7
8
9
10
11
import re
text = "hello 123, world!"

# 匹配任意一个数字
print(re.findall(r'[0-9]', text)) # ['1', '2', '3']

# 匹配任意一个字母(大小写)
print(re.findall(r'[a-zA-Z]', text)) # ['h','e','l','l','o','w','o','r','l','d']

# 匹配任意一个元音字母
print(re.findall(r'[aeiou]', text)) # ['e','o','o']

范围表示与特殊位置

写法 含义 注意
[0-9] 匹配任一数字(等价于 \d) 范围按 ASCII 码顺序
[a-z] 匹配任一小写字母 不能写成 [z-a](错误顺序)
[A-Za-z0-9_] 匹配字母数字下划线(等价于 \w) 可组合多段范围
[-az] 匹配 -、a 或 z 连字符在开头或结尾时表示字面量
[az-] 匹配 a、z 或 - 连字符在末尾同样表示字面量

取反操作 [^]

在字符类内部开头使用 ^ 表示取反,匹配除括号内字符外的任意字符。

1
2
print(re.findall(r'[^0-9]', 'a1b2c3'))   # ['a', 'b', 'c'](非数字)
print(re.findall(r'[^aeiou]', 'hello')) # ['h', 'l', 'l'](非元音)

预定义字符类在 [] 中的使用

常见的 \d、\w、\s 可在字符类内部使用,代表其对应的字符集合。

写法 实际含义 等价于
[\d] 匹配数字 [0-9]
[\w] 匹配字母数字下划线 [A-Za-z0-9_]
[\s] 匹配空白字符 [ \t\n\r\f\v]
[^\s] 匹配非空白字符 \S
1
print(re.findall(r'[\w-]+', 'user-name_123'))   # ['user-name_123'](字母数字下划线或连字符)

字符类内部的元字符转义规则(陷阱提醒)

在 [] 内部,除 ^、-、] 和反斜杠 \ 外,大多数元字符(如 .、*、+、?、|、() 等)都失去特殊含义,无需转义,匹配其字面量。

  • 要匹配 ],需放在开头或转义:[]] 或 \]。
  • 要匹配 ^,不要放在开头(除非取反),如 [a^] 匹配 a 或 ^。
  • 要匹配 -,放在开头或结尾,如 [-az] 或 [az-]。